<?php

require_once "Basic.php";

class PayAllocation extends BasicEntity {
  
  private $idLocacao;
  private $returned;
  private $precoDiaria;
  private $precoKm;
  
  public function __construct($idLocacao) {
    if(gettype($idLocacao) !== "integer") {
      throw new Exception("idLocacao não é um integer.");
    }
    $this->idLocacao = $idLocacao;
    $db = new DBUtils();
    $db->connect();
    $db->runQuery("select * from DadosPagamento(?)", array($idLocacao));
    $item = $db->getItem();
    
    
    if($item === null) {
      $this->idLocacao = null;
      $db->close();
      return;
    }
    
    
    if($item->kmDevolucao === null) {
      $this->returned = false;
      $db->close();
      return;
    }
    else {
      $this->returned = true;
    }
    
    $kmRodada = $item->kmDevolucao - $item->kmObtencao;
    $diff = $item->dataDevolucao->diff($item->dataObtencao);
    $this->precoDiaria = bcmul(strval($diff->days+1), $item->precoDiaria);
    $this->precoKm = bcmul(strval($kmRodada), $item->precoKm);
    $db->close();
    
    $tipoCalculo = array("km" => "Kilometragem", "diaria" => "Diária");
    $modoPagamento = array("credito" => "Crédito", "debito" => "Débito", "cedulas" => "Cédulas", "outro" => "Outro");
    $this->fields = array (
       new FormField(true, "tipoCalculo", "Kilometragem ou Di&aacute;ria", new FormFieldChoice($tipoCalculo)),
       new FormField(true, "modoPagamento", "Modo de Pagamento", new FormFieldChoice($modoPagamento)),
       new FormField(true, "email", "Email (Pagante)", new FormFieldEmail()),
       new FormField(true, "taxaExtra", "Taxa Extra", new FormFieldPrice(), "0.00")
    );
    $this->processFields();
  }
  
  public function actionDescription() {
    return "Pay";
  }
  
  public function actionPay() {
    foreach($this->fields as $k => $v) {
      $$k = $v->value();
    }
    
    $now = new DateTime("now");
    
    $db = new DBUtils();
    try {
      $db->connect();
      $db->runQuery("select * from cliente where email = ?", array($email));
      $cliente = $db->getItem();
      if($cliente === null) {
        $db->close();
        return htmlentities("Não há nenhum cliente associado a este e-mail.");
      }
      $valor = $tipoCalculo === "km" ? $this->precoKm : $this->precoDiaria;
      $insertQuery = <<<IQ
insert into Pagamento
(dataPagamento, taxaExtra, valor, tipoCalculo, modoPagamento, cliente, locacao)
values
(?, ?, ?, ?, ?, ?, ?)
IQ;
      $args = array($now, $taxaExtra, $valor, $tipoCalculo, $modoPagamento, $cliente->idCliente, $this->idLocacao);
      $db->runQuery($insertQuery, $args);
      $db->close();
    }
    catch(DBError $e) {
      logMessage($e->errors, "PayAllocation");
      $db->close();
      return "Falha no banco de dados. O erro foi reportado.";
    }
    
    return true;
  }
  
  public function precoKm() {
    return $this->precoKm;
  }
  
  public function precoDiaria() {
    return $this->precoDiaria;
  }
  
  public function valid() {
    return $this->idLocacao !== null;
  }
  
  public function returned() {
    return $this->returned;
  }
  
}

mustBeEmployee();
mustBe(isset($_GET["idLocacao"]));
$idLocacao = intval($_GET["idLocacao"]);

correctStdFormGET();


$page = new Page(htmlentities("Pagar uma Locação"));
$pay = new PayAllocation($idLocacao);
if(!$pay->valid()) {
  $page->addContent("<p class='errorMessage'>" .
    htmlentities("O código da locação que foi fornecido não corresponde a uma locação existente.") .
    "</p>");
}
else if(!$pay->returned()) {
  $page->addContent("<p class='errorMessage'>" .
    htmlentities("O código da locação que foi fornecido não corresponde a uma locação retornada.") .
    "</p>");
}
else {
  $form = new StdForm($pay, $_GET, $_POST, "", htmlentities("Locação quitada.") . "</p>",
                      "PayAllocation.php?idLocacao=${idLocacao}");
  if(!$form->processForm() || !$form->receiving()) {
    $page->addContent("<p><b>" . htmlentities("Preço por diária") . "</b>: " . adjustMoney($pay->precoDiaria()) . ".</p>");
    $page->addContent("<p><b>" . htmlentities("Preço por kilometragem") . "</b>: " . adjustMoney($pay->precoKm()) . ".</p>");
  }
  $page->addContent($form->getHtml());
}

echo $page->getHtml();

